''' <summary>
''' This is the main type for your game
''' </summary>
Public Class Game1
    Inherits Microsoft.Xna.Framework.Game

    Private WithEvents graphics As GraphicsDeviceManager
    Private WithEvents spriteBatch As SpriteBatch

    Private ContentDir As String = System.AppDomain.CurrentDomain.BaseDirectory & "Content\"
    Private BaseEffect As Effect
    Private GameEnv As World.GameEnvironment

    Public Sub New()
        graphics = New GraphicsDeviceManager(Me)
        'Content.RootDirectory = "Content"
    End Sub

    ''' <summary>
    ''' Allows the game to perform any initialization it needs to before starting to run.
    ''' This is where it can query for any required services and load any non-graphic
    ''' related content.  Calling MyBase.Initialize will enumerate through any components
    ''' and initialize them as well.
    ''' </summary>
    Protected Overrides Sub Initialize()
        ' TODO: Add your initialization logic here

        'graphics.PreferredBackBufferWidth = 1280
        'graphics.PreferredBackBufferHeight = 768
        'graphics.IsFullScreen = True
        'graphics.ApplyChanges()

        GameEnv = New World.GameEnvironment(graphics, ContentDir)
        MyBase.Initialize()
    End Sub

    ''' <summary>
    ''' LoadContent will be called once per game and is the place to load
    ''' all of your content.
    ''' </summary>
    Protected Overrides Sub LoadContent()
        ' Create a new SpriteBatch, which can be used to draw textures.
        'spriteBatch = New SpriteBatch(GraphicsDevice)
        'Dim Tex2D As Texture2D

        Dim FS As New System.IO.FileStream(ContentDir & "FX\MainFX.bin", IO.FileMode.Open)
        Dim bLen As Integer
        bLen = CInt(FS.Length - 1)
        Dim Bytes(bLen) As Byte
        FS.Read(Bytes, 0, bLen)
        FS.Close()
        FS = Nothing
        BaseEffect = New Effect(graphics.GraphicsDevice, Bytes)
        Mouse.SetPosition(CInt(GraphicsDevice.Viewport.Width / 2), CInt(GraphicsDevice.Viewport.Height / 2))
        GameEnv.Load()
        ' TODO: use Me.Content to load your game content here
    End Sub

    ''' <summary>
    ''' UnloadContent will be called once per game and is the place to unload
    ''' all content.
    ''' </summary>
    Protected Overrides Sub UnloadContent()
        ' TODO: Unload any non ContentManager content here
    End Sub

    ''' <summary>
    ''' Allows the game to run logic such as updating the world,
    ''' checking for collisions, gathering input, and playing audio.
    ''' </summary>
    ''' <param name="gameTime">Provides a snapshot of timing values.</param>
    Protected Overrides Sub Update(ByVal gameTime As GameTime)
        ' Allows the game to exit
        If GamePad.GetState(PlayerIndex.One).Buttons.Back = ButtonState.Pressed Then
            Me.Exit()
        ElseIf Keyboard.GetState.IsKeyDown(Keys.Escape) = True Then
            Me.Exit()
        End If
        GameEnv.Update(gameTime)
        ' TODO: Add your update logic here
        MyBase.Update(gameTime)
    End Sub

    ''' <summary>
    ''' This is called when the game should draw itself.
    ''' </summary>
    ''' <param name="gameTime">Provides a snapshot of timing values.</param>
    Protected Overrides Sub Draw(ByVal gameTime As GameTime)

        GraphicsDevice.Clear(Color.Black)

        GameEnv.Draw(gameTime, GraphicsDevice, BaseEffect)

        MyBase.Draw(gameTime)
    End Sub

End Class
